package com.dmz.java.functional;

import java.util.ArrayList;
import java.util.function.Predicate;

/**
 * Predicate：接受一个输入参数，返回一个布尔值结果。
 * (1)boolean test(T t)：对给定的参数进行判断（判断逻辑由Lambda表达式实现），返回一个布尔值。
 * (2)default Predicate<T> negate()：返回一个逻辑的否定，对应逻辑非。
 * (3)default Predicate<T> and(Predicate other)：返回一个组合判断，对应短路与。
 * (4)default Predicate<T> or(Predicate other)：返回一个组合判断，对应短路或。
 * (5)Predicate接口通常用于判断参数是否满足指定的条件
 */
public class PredicateHelloWord {
    public static void main(String[] args) {

        //negate、test案例
        //Lambda表达式
//        boolean b=checkString("Hello",(String str)->{
//            return str.length()>8;
//        });
        boolean b=checkString("Hello",str->str.length()>8);
        System.out.println(b);
        System.out.println("****************************");
        b=checkString1("Hello",str->str.length()>8);
        System.out.println(b);

        // and、or案例
        boolean b1=checkString("hello",s->s.length()>8,s->s.length()<15);
        boolean b2=checkString("helloworld",s->s.length()>8,s->s.length()<15);
        System.out.println(b1);
        System.out.println(b2);

        //筛选满足条件的数据:姓名长度>2且年龄>20
        String[] arr={"唐青枫,20","慕晴,21","曲无忆,22","孔雀,23","离玉堂,25"};
        //姓名长度>2且年龄>20
        ArrayList<String> arrayList=myFilter(arr,str->str.split(",")[0].length()>2,
                str->Integer.parseInt(str.split(",")[1])>20);
        for(String str:arrayList){
            System.out.println(str);
        }
    }

    private static boolean checkString(String str, Predicate<String> pre){
        return pre.test(str);
    }

    private static boolean checkString1(String str,Predicate<String> pre){
//        return !pre.test(str);
        //上一句等价于
        return pre.negate().test(str);
    }

    private static boolean checkString(String str, Predicate<String> pre1, Predicate<String> pre2){
//        boolean b1=pre1.test(str);
//        boolean b2=pre2.test(str);
//        boolean b=b1 && b2;
//        return b;
        //上述等价于
        return pre1.and(pre2).test(str);//判断两个条件和

        //对应的有
//      return pre1.or(pre2).test(str);//判断两个条件或
    }

    private static ArrayList<String> myFilter(String[] arr, Predicate<String> pre1, Predicate<String> pre2){
        ArrayList<String> arrayList=new ArrayList<String>();
        for(int i=0;i<arr.length;i++){
            if(pre1.and(pre2).test(arr[i])){
                arrayList.add(arr[i]);
            }
        }
        return arrayList;
    }
}
